﻿using System.Collections.Generic;
using System.Text;

internal static class HTMLCharacterConverter
{
    private static readonly Dictionary<char, string> HTMLEscapeLiterals = new Dictionary<char, string>();

    static HTMLCharacterConverter()
    {
        HTMLEscapeLiterals.Add('"', "&quot;");
        HTMLEscapeLiterals.Add('<', "&lt;");
        HTMLEscapeLiterals.Add('>', "&gt;");
        HTMLEscapeLiterals.Add('\x00a1', "&iexcl;");
        HTMLEscapeLiterals.Add('\x00a2', "&cent;");
        HTMLEscapeLiterals.Add('\x00a3', "&pound;");
        HTMLEscapeLiterals.Add('\x00a4', "&curren;");
        HTMLEscapeLiterals.Add('\x00a5', "&yen;");
        HTMLEscapeLiterals.Add('\x00a6', "&brvbar;");
        HTMLEscapeLiterals.Add('\x00a7', "&sect;");
        HTMLEscapeLiterals.Add('\x00a8', "&uml;");
        HTMLEscapeLiterals.Add('\x00a9', "&copy;");
        HTMLEscapeLiterals.Add('\x00aa', "&ordf;");
        HTMLEscapeLiterals.Add('\x00ab', "&laquo;");
        HTMLEscapeLiterals.Add('\x00ac', "&not;");
        HTMLEscapeLiterals.Add('\x00ad', "&shy;");
        HTMLEscapeLiterals.Add('\x00ae', "&reg;");
        HTMLEscapeLiterals.Add('\x00af', "&macr;");
        HTMLEscapeLiterals.Add('\x00b0', "&deg;");
        HTMLEscapeLiterals.Add('\x00b1', "&plusmn;");
        HTMLEscapeLiterals.Add('\x00b2', "&sup2;");
        HTMLEscapeLiterals.Add('\x00b3', "&sup3;");
        HTMLEscapeLiterals.Add('\x00b4', "&acute;");
        HTMLEscapeLiterals.Add('\x00b5', "&micro;");
        HTMLEscapeLiterals.Add('\x00b6', "&para;");
        HTMLEscapeLiterals.Add('\x00b7', "&middot;");
        HTMLEscapeLiterals.Add('\x00b8', "&cedil;");
        HTMLEscapeLiterals.Add('\x00b9', "&sup1;");
        HTMLEscapeLiterals.Add('\x00ba', "&ordm;");
        HTMLEscapeLiterals.Add('\x00bb', "&raquo;");
        HTMLEscapeLiterals.Add('\x00bc', "&frac14;");
        HTMLEscapeLiterals.Add('\x00bd', "&frac12;");
        HTMLEscapeLiterals.Add('\x00be', "&frac34;");
        HTMLEscapeLiterals.Add('\x00bf', "&iquest;");
        HTMLEscapeLiterals.Add('\x00c0', "&Agrave;");
        HTMLEscapeLiterals.Add('\x00c1', "&Aacute;");
        HTMLEscapeLiterals.Add('\x00c2', "&Acirc;");
        HTMLEscapeLiterals.Add('\x00c3', "&Atilde;");
        HTMLEscapeLiterals.Add('\x00c4', "&Auml;");
        HTMLEscapeLiterals.Add('\x00c5', "&Aring;");
        HTMLEscapeLiterals.Add('\x00c6', "&AElig;");
        HTMLEscapeLiterals.Add('\x00c7', "&Ccedil;");
        HTMLEscapeLiterals.Add('\x00c8', "&Egrave;");
        HTMLEscapeLiterals.Add('\x00c9', "&Eacute;");
        HTMLEscapeLiterals.Add('\x00ca', "&Ecirc;");
        HTMLEscapeLiterals.Add('\x00cb', "&Euml;");
        HTMLEscapeLiterals.Add('\x00cc', "&Igrave;");
        HTMLEscapeLiterals.Add('\x00cd', "&Iacute;");
        HTMLEscapeLiterals.Add('\x00ce', "&Icirc;");
        HTMLEscapeLiterals.Add('\x00cf', "&Iuml;");
        HTMLEscapeLiterals.Add('\x00d0', "&ETH;");
        HTMLEscapeLiterals.Add('\x00d1', "&Ntilde;");
        HTMLEscapeLiterals.Add('\x00d2', "&Ograve;");
        HTMLEscapeLiterals.Add('\x00d3', "&Oacute;");
        HTMLEscapeLiterals.Add('\x00d4', "&Ocirc;");
        HTMLEscapeLiterals.Add('\x00d5', "&Otilde;");
        HTMLEscapeLiterals.Add('\x00d6', "&Ouml;");
        HTMLEscapeLiterals.Add('\x00d7', "&times;");
        HTMLEscapeLiterals.Add('\x00d8', "&Oslash;");
        HTMLEscapeLiterals.Add('\x00d9', "&Ugrave;");
        HTMLEscapeLiterals.Add('\x00da', "&Uacute;");
        HTMLEscapeLiterals.Add('\x00db', "&Ucirc;");
        HTMLEscapeLiterals.Add('\x00dc', "&Uuml;");
        HTMLEscapeLiterals.Add('\x00dd', "&Yacute;");
        HTMLEscapeLiterals.Add('\x00de', "&THORN;");
        HTMLEscapeLiterals.Add('\x00df', "&szlig;");
        HTMLEscapeLiterals.Add('\x00e0', "&agrave;");
        HTMLEscapeLiterals.Add('\x00e1', "&aacute;");
        HTMLEscapeLiterals.Add('\x00e2', "&acirc;");
        HTMLEscapeLiterals.Add('\x00e3', "&atilde;");
        HTMLEscapeLiterals.Add('\x00e4', "&auml;");
        HTMLEscapeLiterals.Add('\x00e5', "&aring;");
        HTMLEscapeLiterals.Add('\x00e6', "&aelig;");
        HTMLEscapeLiterals.Add('\x00e7', "&ccedil;");
        HTMLEscapeLiterals.Add('\x00e8', "&egrave;");
        HTMLEscapeLiterals.Add('\x00e9', "&eacute;");
        HTMLEscapeLiterals.Add('\x00ea', "&ecirc;");
        HTMLEscapeLiterals.Add('\x00eb', "&euml;");
        HTMLEscapeLiterals.Add('\x00ec', "&igrave;");
        HTMLEscapeLiterals.Add('\x00ed', "&iacute;");
        HTMLEscapeLiterals.Add('\x00ee', "&icirc;");
        HTMLEscapeLiterals.Add('\x00ef', "&iuml;");
        HTMLEscapeLiterals.Add('\x00f0', "&eth;");
        HTMLEscapeLiterals.Add('\x00f1', "&ntilde;");
        HTMLEscapeLiterals.Add('\x00f2', "&ograve;");
        HTMLEscapeLiterals.Add('\x00f3', "&oacute;");
        HTMLEscapeLiterals.Add('\x00f4', "&ocirc;");
        HTMLEscapeLiterals.Add('\x00f5', "&otilde;");
        HTMLEscapeLiterals.Add('\x00f6', "&ouml;");
        HTMLEscapeLiterals.Add('\x00f7', "&divide;");
        HTMLEscapeLiterals.Add('\x00f8', "&oslash;");
        HTMLEscapeLiterals.Add('\x00f9', "&ugrave;");
        HTMLEscapeLiterals.Add('\x00fa', "&uacute;");
        HTMLEscapeLiterals.Add('\x00fb', "&ucirc;");
        HTMLEscapeLiterals.Add('\x00fc', "&uuml;");
        HTMLEscapeLiterals.Add('\x00fd', "&yacute;");
        HTMLEscapeLiterals.Add('\x00fe', "&thorn;");
        HTMLEscapeLiterals.Add('\x00ff', "&yuml;");
    }

    public static string CreateHtmlSaveStringFrom(string text)
    {
        if (string.IsNullOrEmpty(text))
            return string.Empty;

        var builder = new StringBuilder();

        foreach (var ch in text)
        {
            if (HTMLEscapeLiterals.ContainsKey(ch))
                builder.Append(HTMLEscapeLiterals[ch]);
            else
                builder.Append(ch);
        }

        return builder.ToString();
    }
}

